home *** CD-ROM | disk | FTP | other *** search
/ Aminet 37 / Aminet 37 (2000)(Schatztruhe)[!][Jun 2000].iso / Aminet / dev / cross / devpic.lha / devpic / source / picasm / examples / morse.asm < prev    next >
Assembly Source File  |  2000-02-27  |  3KB  |  225 lines

  1. ;
  2. ; morse.asm -- send morse code...
  3. ;
  4. ; also includes some local labels (for testing...)
  5. ;
  6.  
  7. ;
  8. ; example source code for picasm by Timo Rossi
  9. ;
  10.  
  11. ;
  12. ; define PIC device type
  13. ;
  14.     device    pic16f84
  15.  
  16. ;
  17. ; define config fuses
  18. ;
  19.     config    CP=off,WDT=off,PWRT=off,OSC=hs
  20.  
  21. ;
  22. ; include PIC register definitions, and some macros
  23. ;
  24.     include "pic16c84.h" ; this include also works with 16F84
  25.     include "picmac.h"
  26.  
  27. ;
  28. ; include file with morse code definition macros
  29. ;
  30.     include "morse.h"
  31.  
  32. ;
  33. ; bit definitions for port A
  34. ;
  35. A_MOUT    equ    0    ;morse code output (buzzer)
  36. A_LED2    equ    1    ;led (not really used in this program)
  37.  
  38.  
  39. DOT_DELAY    equ    15
  40. DASH_DELAY    equ    3*DOT_DELAY
  41.  
  42. ;
  43. ; define some register file variables
  44. ;
  45.  
  46.     org    $0C
  47.  
  48. delay_cnt    ds    1    ;200hz delay counter
  49.  
  50. d_cnt        ds    1    ;internal delay counter
  51.  
  52. morsebyte    ds    1
  53. bitcnt        ds    1
  54.  
  55. pa_xor_val    ds    1
  56.  
  57. temp_w        ds    1
  58. temp_s        ds    1
  59.  
  60. ;
  61. ; define a morse code message in data EEPROM
  62. ;
  63.     org    0
  64.  
  65.     morsedata edata,"hello world "
  66.  
  67.     edata    0    ;end marker
  68. ;
  69. ; code start
  70. ;
  71.     org    0
  72.     goto    reset_entry
  73.  
  74.  
  75.     org    4
  76. ;
  77. ; interrupt entry point
  78. ;
  79. ; 4MHz crystal --> 1MHz instruction clock
  80. ; TMR0 free-running, prescaler divides by 4 -->
  81. ;
  82. ; timer interrupt occurs 976 times per second
  83. ;
  84.     save_w_stat
  85.  
  86.     decf    d_cnt,F
  87.     bnz    int_a
  88.  
  89.     movlw    5
  90.     movwf    d_cnt
  91.  
  92. ;
  93. ; delay_cnt is decremenmented every 6's interrupt
  94. ; --> 195 times per second (delay approx 5 ms)
  95. ;
  96.     decf    delay_cnt,F
  97.  
  98. int_a
  99. ;
  100. ; sound is generated by toggling the buzzer output once per interrupt,
  101. ; so the fundamental frequency is 488 Hz.
  102. ;
  103.     movf    pa_xor_val,W
  104.     xorwf    PORTA,F
  105.  
  106.     bcf    INTCON,RTIF
  107.     restore_w_stat
  108.     retfie
  109.  
  110. reset_entry:
  111.     movlw    0xff
  112.     movwf    PORTA    ;initialize port A so that LED and buzzer are off
  113.  
  114.     bsf    STATUS,RP0            ;register page 1
  115.     movlw    ~((1<<A_MOUT)|(1<<A_LED2))    ;LEDs as outputs,
  116.     movwf    TRISA                ;other PORTA pins as inputs
  117.  
  118. ; timer counts instruction cycles, assign prescaler to timer, divide by 4
  119. ; (and disable port B weak pull-ups)
  120.     movlw    (1<<RBPU)|(1<<PS0)
  121.     movwf    OPTIO
  122.  
  123.     bcf    STATUS,RP0            ;register page 0
  124.  
  125.     movlw    1
  126.     movwf    d_cnt
  127.  
  128.     clrf    pa_xor_val
  129.  
  130.     movlw    (1<<RTIE)|(1<<GIE)    ;enable timer interrupt
  131.     movwf    INTCON
  132.  
  133. restart_string
  134.     clrf    EEADR
  135.  
  136. loop
  137.     bsf    STATUS,RP0    ;reg. page 1
  138.     bsf    EECON1,ERD    ;read EEPROM
  139.     bcf    STATUS,RP0    ;reg. page 0
  140.     movf    EEDATA,W
  141.     bz    restart_string
  142.  
  143.     call    send_morse_char
  144.     incf    EEADR,F
  145.     goto    loop
  146.  
  147. ;
  148. ; send one morse code character
  149. ; character code (generated by the morsechar macro) in W
  150. ;
  151. send_morse_char
  152.     movwf    morsebyte
  153.     comf    morsebyte,W
  154.     bz    send_space
  155.  
  156.     movlw    7
  157.     movwf    bitcnt
  158.  
  159.     local
  160.  
  161. skip_pad_loop
  162.     brset    morsebyte,7,=skipped
  163.     decf    bitcnt,F
  164. ; we don't care if carry is set or not, the bits shifed in
  165. ; by the following instruction are not used anyway
  166.     rlf    morsebyte,F
  167.     goto    skip_pad_loop
  168.  
  169. =skipped
  170.     rlf    morsebyte,F
  171.  
  172.     endlocal
  173.  
  174.     local
  175. =loop
  176.     btfss    morsebyte,7
  177.     call    dot
  178.     btfsc    morsebyte,7
  179.     call    dash
  180.     rlf    morsebyte,F
  181.  
  182.     movlw    DOT_DELAY
  183.     call    delay
  184.  
  185.     decfsz    bitcnt,F
  186.     goto    =loop
  187.  
  188.     endlocal
  189.  
  190.     movlw    2*DOT_DELAY    ;inter-character gap
  191.     call    delay
  192.     return
  193.  
  194. send_space
  195.     movlw    2*DOT_DELAY
  196.     call    delay
  197.     movlw    3*DOT_DELAY
  198.     call    delay
  199.     return
  200.  
  201. dash    movlw    DASH_DELAY
  202.     goto    dot_dash
  203.  
  204. dot    movlw    DOT_DELAY
  205.  
  206. dot_dash
  207.     bsf    pa_xor_val,A_MOUT    ;start sound
  208.     call    delay
  209.     bcf    pa_xor_val,A_MOUT    ;end sound
  210.     bsf    PORTA,A_MOUT        ;make sure the buzzer is off
  211.     return
  212.  
  213.     local
  214. ;
  215. ; delay approx. W*5ms
  216. ;
  217. delay    movwf    delay_cnt
  218. =loop
  219.     bpos    delay_cnt,=loop
  220.     return
  221.  
  222.     endlocal
  223.  
  224.     end
  225.